package com.winsdom.mapper.customer;

import com.winsdom.entity.customer.CustomerEnterpriseCreateRequest;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 企业客户创建相关的数据访问接口，提供企业客户信息创建过程中涉及的各类数据操作。
 * 该接口包含了插入企业客户基本信息、地址信息、联系人信息等相关方法。
 */
@Mapper
public interface CustomerEnterpriseCreateMapper {

    /**
     * 插入客户基本信息到客户主表
     * @param customer 客户基本信息实体，包含客户基础属性
     * @return 插入成功返回1，失败返回0
     */
    int insertCustomer(CustomerEnterpriseCreateRequest customer);

    /**
     * 获取最后一次插入操作生成的自增ID
     * 通常用于获取刚刚插入的客户ID
     * @return 最后插入记录的自增ID
     */
    Long getLastInsertId();

    /**
     * 插入企业客户特定信息到企业客户表
     * @param enterprise 企业客户信息实体，包含企业特有属性
     * @return 插入成功返回1，失败返回0
     */
    int insertCustomerEnterprise(CustomerEnterpriseCreateRequest enterprise);

    /**
     * 批量插入客户地址信息
     * @param addresses 地址信息列表，每个元素包含详细地址信息
     * @return 成功插入的记录数
     */
    int insertCustomerAddress(@Param("addresses") List<CustomerEnterpriseCreateRequest.AddressInfo> addresses);

    /**
     * 插入联系人基本信息
     * @param contact 联系人信息实体，包含联系人姓名、电话等基础信息
     * @return 插入成功返回1，失败返回0
     */
    int insertContactPerson(@Param("contact") CustomerEnterpriseCreateRequest.ContactInfo contact);

    /**
     * 获取最后一次插入的联系人ID
     * 用于后续插入联系人属性关联信息
     * @return 最后插入联系人的自增ID
     */
    Long getLastContactPersonId();

    /**
     * 插入联系人与属性分类的关联关系
     * @param contactId 联系人ID
     * @param categoryIds 属性分类ID列表，表示联系人所属的多个分类
     * @return 成功插入的记录数
     */
    int insertContactPersonProperty(@Param("contactId") Long contactId,
                                    @Param("categoryIds") List<Long> categoryIds);

    /**
     * 插入客户证书信息
     * @param customerId 客户ID
     * @param filePath 证书文件存储路径
     * @return 插入成功返回1，失败返回0
     */
    int insertCustomerCertificate(@Param("customerId") Long customerId,
                                  @Param("filePath") String filePath);

    /**
     * 插入客户通知配置信息
     * @param config 通知配置信息实体
     * @return 插入成功返回1，失败返回0
     */
    int insertNotificationConfig(CustomerEnterpriseCreateRequest config);

    /**
     * 插入客户账单配置信息
     * @param config 账单配置信息实体
     * @return 插入成功返回1，失败返回0
     */
    int insertBillingConfig(CustomerEnterpriseCreateRequest config);

    /**
     * 根据属性名称列表查询对应的属性分类ID列表
     * @param propertyNames 属性名称列表
     * @return 对应的属性分类ID列表
     */
    List<Long> getPropertyCategoryIdsByNames(@Param("propertyNames") List<String> propertyNames);
}